﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//#include<stdio.h>
//using std::cout;
//using std::endl;
//namespace N1
//{
//	int a;
//	int b;
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//	namespace N2
//	{
//		int c;
//		int d;
//		int Sub(int left, int right)
//		{
//			return left - right;
//		}
//	}
//}
//
//int main()
//{
//	int ret = N1::Add(1, 2);
//	int sub = N1::N2::Sub(5, 6);
//	cout << ret << endl;
//	cout << sub << endl;
//
//}
//#include<iostream.h>

//#include<iostream>
//using namespace std;
//
//int main()
//{
//	// 1、左移
//	//int i;
//	///*i = i << 1;*/
//	//const char* str = "hello world";
//	//char ch = '\n';
//
//	//// 2、流插入 自动识别类型
//	/*cout << str << i << ch << endl;
//	printf("%s%d%c", str,i,ch);*/
//	
//	// 右移
//	
//	//// 流提取
//	/*cin >> i >> ch;
//	cout << str << i << ch << endl;*/
//
//	//scanf("%d%c", &i, &ch);
//	//printf("%s%d%c", str, i, ch);
//
//	double d = 1.11111111;
//	printf("%.2lf\n", d);
//	cout << d << endl;
//
//	return 0;
//}

/////////////////////////////////////////////////////////////
 /*缺省/默认 参数*/
//
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//
//int main()
//{
//	Func(1);
//	Func();
//
//	return 0;
//}

 //缺省/默认 参数
//#include<iostream>
//using namespace std;
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//
//int main()
//{
//	Func(1);
//	Func();
//
//	return 0;
//}


// //全缺省
////void Func(int a = 10, int b = 20, int c = 30)
////{
////	cout << "a = " << a << endl;
////	cout << "b = " << b << endl;
////	cout << "c = " << c << endl << endl;
////}
////
////int main()
////{
////	Func(1, 2, 3);
////	Func(1, 2);
////	Func(1);
////	Func();
////
////	return 0;
////}
//#include<iostream>
//using namespace std;
// //半缺省 从右往左连续给
//void Func(int a, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//int main()
//{
//	Func(1, 2, 3);
//	Func(1, 2);
//	Func(1);
//
//	return 0;
//}

//// C语言不允许同名函数
//// CPP语言允许同名函数，要求：函数名相同，参数不同，构成函数重载
//// 1、参数类型的不同
//// 2、参数个数不同
//// 3、参数顺序不同(本质还是类型不同)
//// _Z3Addii
//void Add(int left, int right);
////{
////	cout << "int Add(int left, int right)" << endl;
////	return left + right;
////}
//
//// _Z3Adddd
//double Add(double left, double right);
////{
////	cout << "double Add(double left, double right)" << endl;
////	return left + right;
////}
//
//void f(int a, char b);
//void f(char b, int a);
//
//// C语言不支持重载   链接时，直接用函数名去找地址，有同名函数，区分不开
//// CPP如何支持的呢？ 函数名修饰规则，名字中引入参数类型，各个编译器自己实现了一套
//int main()
//{
//	Add(1, 2);
//	Add(1.1, 2.2);
//
//	//f(1, 'a'); // call f(?)
//	//f('a', 1); // call f(?)
//
//	// 
//	f(1, 'a'); // call _Z1fic(?)
//	f('a', 1); // call _Z1fci(?)
//
//	return 0;
//}


//
//int main()
//{
//	int a = 0;
//
//	// 引用，b就是a的别名
//	int& b = a;
//
//	cout << &b << endl;
//	cout << &a<< endl;
//
//	b++;
//	a++;
//
//	cout << b << endl;
//	cout << a << endl;
//
//	int& c = a;
//	int& d = c;
//	d++;
//	cout << d << endl;
//
//	return 0;
//}
// 
//#include<iostream>
//using namespace std;
// //做参数
//void Swap(int* a, int *b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
//void Swap(int& a, int &b)
//{
//	int tmp = a;
//	a = b;
//	b = tmp;
//}
//
//int main()
//{
//	int x = 0, y = 1;
//	Swap(&x, &y);
//	cout << "x = " << x << " y = " << y << endl;
//	Swap(x, y);
//	cout << "x = " << x << " y = " << y << endl;
//	return 0;
//}



//int main()
//{
//
//	// 1、引用必须初始化
//	//int& b;
//	// b = c;
//
//	// 2、引用定义后，不能改变指向
//	//int d = 2;
//	//int& b = a;
//	//int& b = d;
//	//cout << b << endl;
//	// 
//// 3、一个变量可以有多个引用，多个别名
//	int a = 0;
//	int& b = a;
//	int& d = b;
//	cout << "b = " << b << " d = " << d << endl;
//	return 0;
//}




//void TestConstRef()
//{
//	const int a = 10;
//	//int& ra = a;   // 该语句编译时会出错，a为常量
//	const int& ra = a;
//	// int& b = 10; // 该语句编译时会出错，b为常量
//	const int& b = 10;
//	double d = 12.34;
//	//int& rd = d; // 该语句编译时会出错，类型不同
//	const int& rd = d;
//
//	int x = 1;
//	int& f = a + x;//该语句编译时会出错,a + x 相当于临时变量，具有常量性质
//	const int& f = a + x;
//}


//using namespace std;
//// 指针和引用的功能是类似的，有重叠的
//// C++的引用，对指针使用比较复杂的场景进行一些替换，让代码更简单易懂，但是不能完全替代指针
//// 引用不能完全替代指针原因：引用定义后，不能改变指向
//struct Node
//{
//	struct Node* next;
//	struct Node* prev;
//	int val;
//};
//
////void PushBack(struct Node* phead, int x)
////{
////	// phead = newnode;
////}
//
////void PushBack(struct Node** pphead, int x)
////{
////	// *pphead = newnode;
////}
//
//void PushBack(struct Node*& phead, int x)
//{
//	//phead = newnode;
//}
//
//int main()
//{
//	struct Node* plist = NULL;
//
//	return 0;
//}
//
//typedef struct Node
//{
//	struct Node* next;
//	struct Node* prev;
//	int val;
//}LNode, *PNode;
//
//void PushBack(PNode& phead, int x)
//{
//	//phead = newnode;
//}
//
////void PushBack(SeqList* ps, int x);
////void PushBack(SeqList& ps, int x);
////{}
//
//int main()
//{
//	PNode plist = NULL;
//
//	return 0;
//}


 //引用 1、做参数（a、输出型参数 b、对象比较大，减少拷贝，提高效率）
 //这些效果，指针也可以，但是引用更方便
//void Swap(int& a, int& b);
//int* preorderTraversal(struct TreeNode* root, int* returnSize);
//int* preorderTraversal(struct TreeNode* root, int& returnSize);


//struct A { int a[10000]; };
//void TestFunc1(A a) {}
//void TestFunc2(A& a) {}
//void main()
//{
//	A a;
//	// 以值作为函数参数
//	size_t begin1 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc1(a);
//	size_t end1 = clock();
//
//	// 以引用作为函数参数
//	size_t begin2 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc2(a);
//	size_t end2 = clock();
//
//	// 分别计算两个函数运行结束后的时间
//	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
//	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
//}




//int& func()
//{
//	int a = 0;
//	return a;
//}
//
//int& fx()
//{
//	int b = 1;
//	return b;
//}
//
//int main()
//{
//	int& ret = func();
//	cout << ret << endl;
//
//	fx();
//	cout << ret << endl;
//
//	return 0;
//}



// 容易犯错注意点：
// 1、不是函数
// 2、分号
// 3、括号控制优先级
// 核心点：宏是预处理阶段进行替换
//#define ADD(int a, int b) return a+b;
//#define ADD(a, b) a+b;
//#define ADD(a, b) (a+b)

//#include<iostream>
//using namespace std;
//#define ADD(a, b) ((a)+(b))
//// 为什么要加里面的括号？
//int main()
//{
//	if (ADD(1, 2))
//	{}
//
//	ADD(1, 2) * 3;
//
//	int x = 1, y = 2;
//	ADD(x | y, x & y);  // (x|y + x&y)
//
//	return 0;
//}
// //宏的缺点：
// //1、语法复杂，坑很多，不容易控制
// //2、不能调试
// //3、没有类型安全的检查



#include<iostream>
using namespace std;

inline int Add(int a, int b)
{
	return a + b;
}

int main()
{
	int ret1 = Add(1, 2) * 3;

	int x = 1, y = 2;
	int ret2 = Add(x | y, x & y);
	return 0;
}